package com.etc.controller;

import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import com.etc.util.QiniuCloudUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.net.URLEncoder;

@RestController
public class FileDownloadController {
    /**
     * 从本地服务器下载文件(从目录中下载到本地download)
     * @param fileName 下载的文件名
     * @param type    下载的文件类型
     * @param response
     * @throws IOException
     */
    @RequestMapping("/download")
    public void downloadFile(@RequestParam String fileName, @RequestParam String type, HttpServletResponse response) throws IOException{
        //定义存储的根目录
        String root="";

        // 通过参数type区分根目录
        if ("image".equals(type)) {
            root = "E:\\upload\\image\\";
        } else if("txt".equals(type)){
            root = "E:\\upload\\txt\\";
        } else if("video".equals(type)){
            root = "E:\\upload\\video\\";
        }
        // 定义要下载的文件的完整路径
        StringBuffer path = new StringBuffer();
        path.append(root).append(fileName); // E:\\upload\\image\\154fe6ab-7759-4e33-9b90-73ecc238d951.jpg
        // 关联文件
        File file = new File(path.toString());

        // 判断关联文件是否存在
        if (file.exists()) {
            // 读取
            // 利用字节输入流读取文件
            FileInputStream fis = new FileInputStream(file);
            // 利用字节输出流
            ByteOutputStream bos = new ByteOutputStream();

            // 字节数组
            byte[] b = new byte[1024];
            int n;
            while((n = fis.read(b)) != -1) { // 有数据可读
                bos.write(b, 0, n); // 写
            }

            // 设置响应编码格式
            response.setCharacterEncoding("utf-8");
            // 设置响应头,Content-Disposition 响应头指示回复的内容该以何种形式展示，是以内联的形式（即网页或者页面的一部分），还是以附件的形式下载并保存到本地
            response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));

            // 通过response对象得到Servlet输出流将文件以字节形式输出到网页中
            ServletOutputStream sos = response.getOutputStream();
            sos.write(bos.getBytes());

            // 关闭流
            bos.close();
            fis.close();
        }
    }

    @RequestMapping("/downloadFileFromQiniu")
    public void downloadFileFromQiniu(@RequestParam String fileName, HttpServletResponse response)throws IOException{
        //字节输入流
        InputStream inputStream=null;
        //字节输出流
        OutputStream os=null;
        try {

            //通过七牛工具类获取下载链接
            String downloadURL = QiniuCloudUtil.downloadURL(fileName);
            //构建输入流
            inputStream=new URL(downloadURL).openStream();

            //构建字节数据的输出流
            ByteArrayOutputStream outStream=new ByteArrayOutputStream();
            byte[] buffer=new byte[1024];
            int len=0;
            while ((len=inputStream.read(buffer))!=-1){
                outStream.write(buffer,0,len);
            }
            inputStream.close();

            byte[] data=outStream.toByteArray();
            response.reset();
            // 设置响应头,Content-Disposition 响应头指示回复的内容该以何种形式展示，是以内联的形式（即网页或者页面的一部分），还是以附件的形式下载并保存到本地
            response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
            response.setContentType("application/octet-stream");
            os=response.getOutputStream();

            os.write(data);
            os.flush();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (inputStream!=null){
                inputStream.close();
            }
            if (os!=null){
                os.close();
            }
        }


    }
}
